在通讯场景下,两端的数据处理能力不同,或者受传输单次数据传输量的的限制,很多时候我们都需要将数据进行缓存,然后在进行处理,fifo就是一种很好的数据缓存模型,下面我写了一个实例,可直接移植使用
注意,当数据长度大于fifo缓存大小的时候,会直接覆盖,请合理设置fifo的buf大小,可以通过fifo_create设置缓存大小
typedef unsigned char uint8;
typedef unsigned short uint16;
#define MAX_FIFO_BUFFER_LEN 21
typedef struct _fifo_t
{
uint8 *buff;
uint16 fifo_len;
uint16 data_len;
uint16 read_index;
uint16 write_index;
}fifo_t;
fifo_t *g_user_fifo;
/***********************************************************************************************
*函数名 : write_fifo
*函数功能描述 : 向fifo中写入数据
*函数参数 : fifo;data,待写入数据;len,待写入数据长度
*函数返回值 : 实际写入数据长度
*作者 :layne
***********************************************************************************************/
uint16 write_fifo(fifo_t *fifo, uint8 *data, uint16 len)
{
uint16 w_len = len;
if(len >= fifo->fifo_len) {
memcpy(fifo->buff, data + len - fifo->fifo_len, fifo->fifo_len);
fifo->read_index = 0;
fifo->write_index = fifo->fifo_len;
fifo->data_len = fifo->fifo_len;
w_len = fifo->fifo_len;
} else {
if(fifo->write_index + len > fifo->fifo_len) {
uint16 tail_len = (fifo->write_index + len) % fifo->fifo_len;
memcpy(fifo->buff + fifo->write_index, data, len - tail_len);
memcpy(fifo->buff, data + len - tail_len, tail_len);
fifo->write_index = tail_len;
} else {
memcpy(fifo->buff + fifo->write_index, data, len);
fifo->write_index += len;
}
if(fifo->data_len + len > fifo->fifo_len) {
fifo->read_index = (fifo->read_index + fifo->data_len + len - fifo->fifo_len) % fifo->fifo_len;
fifo->data_len = fifo->fifo_len;
} else {
fifo->data_len += len;
}
}
return w_len;
}
/***********************************************************************************************
*函数名 : read_fifo
*函数功能描述 : 从fifo中读取数据
*函数参数 : fifo;data,读取数据缓存;len,读取长度
*函数返回值 : 实际读出数据长度
*作者 :layne
***********************************************************************************************/
uint16 read_fifo(fifo_t *fifo, uint8 *data, uint16 len)
{
uint16 r_len = len;
if(fifo->data_len < len)
r_len = fifo->data_len;
if(fifo->read_index + r_len > fifo->fifo_len) {
uint16 tail_len = (fifo->read_index + r_len) % fifo->fifo_len;
memcpy(data, fifo->buff + fifo->read_index, r_len - tail_len);
memcpy(data + r_len - tail_len, fifo->buff, tail_len);
fifo->read_index = tail_len;
} else {
memcpy(data, fifo->buff + fifo->read_index, r_len);
fifo->read_index += r_len;
}
fifo->data_len -= r_len;
if(0 == fifo->data_len) {
fifo->read_index = 0;
fifo->write_index = 0;
}
return r_len;
}
/***********************************************************************************************
*函数名 : fifo_create
*函数功能描述 : 创建一个fifo
*函数参数 : fifo_buf_len,fifo缓存buf的大小
*函数返回值 : fifo_t *,fifo指针
*作者 :layne
***********************************************************************************************/
fifo_t *fifo_create(uint16 fifo_buf_len)
{
fifo_t *m_fifo;
m_fifo = (fifo_t *)malloc(sizeof(fifo_t));
m_fifo->buff = (uint8 *)malloc(fifo_buf_len);
if(NULL == m_fifo->buff){
free(m_fifo);
return NULL;
}
m_fifo->fifo_len = fifo_buf_len;
m_fifo->data_len = 0;
m_fifo->read_index = 0;
m_fifo->write_index = 0;
return m_fifo;
}
/***********************************************************************************************
*函数名 : fifo_release
*函数功能描述 : 释放一个fifo
*函数参数 : fifo,待释放函数指针
*函数返回值 : void
*作者 :layne
***********************************************************************************************/
void fifo_release(fifo_t *fifo)
{
free(fifo->buff);
free(fifo);
}
/***********************************************************************************************
*函数名 : test_func
*函数功能描述 : 测试函数,控制台输入0为写入测试,1为读取测试,其他值退出
*函数参数 : void
*函数返回值 : void
*作者 :layne
***********************************************************************************************/
void test_func()
{
uint8 w[5] = {0x45, 0x34, 0x53, 0x12, 0x11};
uint8 r[7];
int i=0;
int read_len=0;
g_user_fifo = fifo_create(MAX_FIFO_BUFFER_LEN);
while(i |